#include <Arduino.h>
#include <WiFi.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <Adafruit_I2CDevice.h>

#define TFT_SCLK 2 // Clock
#define TFT_MOSI 3 // Data
#define TFT_RST 10
#define TFT_DC 6
#define TFT_CS 7
#define TFT_MOSI 3 // Data out
#define TFT_SCLK 2 // Clock out
//#define TFT_BL  11 //不接，不使用使能，芯片默认使能enable

#define NTP1 "ntp1.aliyun.com"
#define NTP2 "ntp2.aliyun.com"
#define NTP3 "ntp3.aliyun.com"

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

const char *ssid = "123456";
const char *password = "776654321";

// color definitions
// const uint16_t  Display_Color_Black        = 0x0000;    //黑色
// const uint16_t  Display_Color_Red          = 0x001F;    //红色
// const uint16_t  Display_Color_Blue         = 0xF800;    //蓝色
// const uint16_t  Display_Color_Green        = 0x07E0;    //绿色
// const uint16_t  Display_Color_Yellow       = 0x07FF;    //黄色

// const uint16_t  Display_Color_Magenta      = 0xF81F;    //洋红

// const uint16_t  Display_Color_Cyan         = 0xFFE0;    //青色

// const uint16_t  Display_Color_White        = 0xFFFF;    //白色

const size_t MaxString = 15;

char oldTimeString[MaxString] = {0};

char newTimeString[MaxString] = {0};

void setClock() //详见http://t.csdn.cn/lNVIv

{

  struct tm timeinfo;

  /*struct tm {

  int tm_sec; // 秒，取值0~59；

  int tm_min; // 分，取值0~59；

  int tm_hour; // 时，取值0~23；

  int tm_mday; // 月中的日期，取值1~31；

  int tm_mon; // 月，取值0~11；

  int tm_year; // 年，其值等于实际年份减去1900；

  int tm_wday; // 星期，取值0~6，0为周日，1为周一，依此类推；

  int tm_yday; // 年中的日期，取值0~365，0代表1月1日，1代表1月2日，依此类推；

  int tm_isdst; // 夏令时标识符，实行夏令时的时候，tm_isdst为正；不实行夏令时的进候，tm_isdst为0；不了解情况时，tm_isdst()为负

  };*/

  if (!getLocalTime(&timeinfo))

  {

    //如果获取失败，就开启联网模式，获取时间

    Serial.println("Failed to obtain time");

    configTime(8 * 3600, 0, NTP1, NTP2, NTP3);

    return;
  }

  // 将分钟转化成字符串，用于比较

  sprintf(

      newTimeString,

      "%d",

      timeinfo.tm_min

  );

  Serial.println(newTimeString);

  // delay(2000);

  Serial.println(&timeinfo, "%F %T %A"); // 格式化输出:2021-10-24 23:00:44 Sunday

  Serial.println(&timeinfo, "%F");

  Serial.println(&timeinfo, "%T");

  Serial.println(&timeinfo, "%A");

  Serial.print(asctime(&timeinfo)); //默认打印格式：Mon Oct 25 11:13:29 2021

  if (strcmp(newTimeString, oldTimeString) != 0) // 1分钟刷新一次

  {

    tft.fillScreen(ST7735_BLACK); // LCD清空

    // tft.println("TFT OK");

    tft.setTextSize(2);

    tft.setCursor(0, 0);
    //从左上角原点显示

    tft.println(&timeinfo, "%F");
    //第一行显示日期

    tft.setTextSize(1);
    //行间距

    tft.println();

    tft.setTextSize(2);

    tft.println(&timeinfo, "%A");
    //星期*

    tft.setTextSize(1);

    tft.println();

    tft.setTextSize(3);

    tft.println(&timeinfo, "%R");
    //显示小时和分钟：hh:mm

    strcpy(oldTimeString, newTimeString); //将新的值写入上一次的值
  }

  // else{}
}

void setup()

{

  Serial.begin(115200);

  // Use this initializer if using a 1.8" TFT screen:

  // tft.initR(INITR_BLACKTAB);      // Init ST7735S chip, black tab

  // OR use this initializer if using a 1.8" TFT screen with offset such as WaveShare:

  // tft.initR(INITR_GREENTAB);      // Init ST7735S chip, green tab

  // OR use this initializer (uncomment) if using a 1.44" TFT:

  // tft.initR(INITR_144GREENTAB); // Init ST7735R chip, green tab

  // OR use this initializer (uncomment) if using a 0.96" 160x80 TFT:

  tft.initR(INITR_MINI160x80);
  // Init ST7735S mini display

  // OR use this initializer (uncomment) if using a 1.3" or 1.54" 240x240 TFT:

  // tft.init(240, 240);           // Init ST7789 240x240

  // OR use this initializer (uncomment) if using a 1.69" 280x240 TFT:

  // tft.init(240, 280);           // Init ST7789 280x240

  // OR use this initializer (uncomment) if using a 2.0" 320x240 TFT:

  // tft.init(240, 320);           // Init ST7789 320x240

  // OR use this initializer (uncomment) if using a 1.14" 240x135 TFT:

  // tft.init(135, 240);           // Init ST7789 240x135

  // OR use this initializer (uncomment) if using a 1.47" 172x320 TFT:

  // tft.init(172, 320);           // Init ST7789 172x320

  // SPI speed defaults to SPI_DEFAULT_FREQ defined in the library, you can override it here

  // Note that speed allowable depends on chip and quality of wiring, if you go too fast, you

  // may end up with a black screen some times, or all the time.

  // tft.setSPISpeed(20000000);

  tft.setRotation(3);

  tft.fillScreen(ST7735_BLACK);

  tft.setTextColor(ST7735_YELLOW);

  tft.setTextSize(2);

  tft.println("TFT OK");

  Serial.println();

  WiFi.begin(ssid, password);

  Serial.print("WIFI Connecting");

  tft.print("WIFI Connecting");

  while (WiFi.status() != WL_CONNECTED)

  {

    delay(500);

    Serial.print(".");

    tft.print(".");
  }

  Serial.println();

  Serial.println("WiFi connected!");

  configTime(8 * 3600, 0, NTP1, NTP2, NTP3);

  tft.println();

  tft.println("WiFi connected!");

  delay(1000);

  tft.fillScreen(ST7735_BLACK); // LCD清空

  tft.setCursor(0, 0);

  tft.println("Digital watch is ready");

  delay(1500);

  setClock();

  // 从网络时间服务器上获取并设置时间

  // 获取成功后芯片会使用RTC时钟保持时间的更新
}

void loop()

{

  setClock();
}
